//
//  WBBaseViewController.swift
//  MyWeiBo
//
//  Created by 俞存旭 on 16/9/23.
//  Copyright © 2016年 俞存旭. All rights reserved.
//

import UIKit
//面试题：OC中支持多继承吗？ 如果不支持，如何代替？ 答案： 使用协议代替！
//swift的写法类似于多继承！

/*
 注意：
 1.extension不能有属性
 2.extension不能重写'父类'本类方法，重写父类方法，是子类的职责。扩展是对类的扩展
 */

//class WBBaseViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {
class WBBaseViewController: UIViewController {
    
    //用户登录标记
    var userLogin = false
    //访客视图
    var viditorInfoDictionary: [String: String]?
    
    
    //表格视图，如果用户没有登录，就不创建
    var tableView: UITableView?
    //刷新控件
    var refreshControl: UIRefreshControl?
    //上拉刷新标记
    var isPullup = false
    
    
    
    //自定义导航条
    lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 64))
    lazy var  navItem = UINavigationItem()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupUI()
        
        loadData()
        
    }
    
    override var title: String? {
        
        didSet {
            navItem.title = title
        }
    }
    //加载数据 - 具体的实现由子类负责
    func loadData() {
        //如果子类不是想任何方法，默认关闭刷新
        refreshControl?.endRefreshing()
    }
        
}

//MARK: - 访客视图监听方法
extension WBBaseViewController {
    @objc func login() {
        print("用户登录")
    }
    @objc func register() {
        print("用户注册")
    }
}

//MARK: - 设置界面
extension WBBaseViewController {
    func setColor() -> UIColor {
        let red = CGFloat(arc4random_uniform(255))/CGFloat(255.0)
        let green = CGFloat( arc4random_uniform(255))/CGFloat(255.0)
        let blue = CGFloat(arc4random_uniform(255))/CGFloat(255.0)
        return UIColor.init(red:red, green:green, blue:blue , alpha: 1)
        
    }
    
    func setupUI() {
        
        view.backgroundColor = UIColor.white
        
        //取消自动缩进 - 如果隐藏导航栏辉缩进20个点
        automaticallyAdjustsScrollViewInsets = false
        
        setupNavigationBar()//添加导航条

        userLogin ? setupTableView() : setupVisitorView()
    }
    
    //设置表格 - 用户登录之后执行(子类重写此方法，因此子类不需要关心用户登录之前的逻辑)
    func setupTableView() {
        tableView = UITableView(frame: view.bounds, style: .plain)
        
        view.insertSubview(tableView!, belowSubview: navigationBar)
        
        tableView?.dataSource = self
        tableView?.delegate = self
        
        tableView?.contentInset = UIEdgeInsets(top: navigationBar.bounds.height, left: 0, bottom: tabBarController?.tabBar.bounds.height ?? 49, right: 0)
        
        //设置刷新控件
        //1.实例化控件
        refreshControl = UIRefreshControl()
        //2.添加到表格视图
        tableView?.addSubview(refreshControl!)
        //3.添加监听事件
        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
        
    }

    private func setupNavigationBar() {
        //添加导航条
        view.addSubview(navigationBar)
        //将item设置给bar
        navigationBar.items = [navItem]
        
        //设置navBar  整个背景的渲染颜色
        navigationBar.barTintColor = UIColor(red: 246/255, green: 246/255, blue: 246/255, alpha: 1.0)
        //设置 navBar 的字体颜色（title）
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.darkGray]
        //设置系统按钮的文字渲染颜色
        navigationBar.tintColor = UIColor.orange
    }
    //设置访客视图
    private func setupVisitorView() {
        
        let visitorView = WBVisitorVIew(frame: view.bounds)
        view.insertSubview(visitorView, belowSubview: navigationBar)
        
        print("访客视图\(visitorView)")
        //1.设置访客视图信息
        visitorView.viditorInfo = viditorInfoDictionary
        
        //2.添加访客视图按钮监听方法
        visitorView.loginButton.addTarget(self, action: #selector(login), for: .touchUpInside)
        visitorView.registerButton.addTarget(self, action: #selector(register), for: .touchUpInside)
        
        //3.设置导航信息
        navItem.leftBarButtonItem = UIBarButtonItem(title: "注册", style: .plain, target: self, action: #selector(register))
        navItem.rightBarButtonItem = UIBarButtonItem(title: "登录", style: .plain, target: self, action: #selector(login))

    }
    
}

//MARK: - UITableViewDelegate,UITableViewDataSource
extension WBBaseViewController: UITableViewDelegate,UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return 0
    }
    //基类只准备方法，子类负责具体实现
    //子类数据源方法不需要 super
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //只是保证没有语法错误
        return UITableViewCell()
    }
    //在显示最后一行，做上拉刷新
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        
        //1.判断indexpath是否最后一行
        let row = indexPath.row
        //section
        let section = tableView.numberOfSections - 1
        if row < 0 || section < 0 {
            return
        }
        
        //3.行数
        let count = tableView.numberOfRows(inSection: section)
        //如果是最后一行，同时没有开始上拉刷新
        if row == (count - 1) && !isPullup {
            
            print("上拉刷新")
            isPullup = true
            //开始刷新
            
            loadData()
        }
        
    }
    
}



















